import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.lang.*;

/**
 * Clase jugador representa al jugador con la imagen de un chango
 * 
 * @author Sánchez Ovalle Daniel, Alcantar Noyola Cristian Andres
 * @version 26/03/13
 */
public class Jugador extends Actor
{
    private GreenfootImage imageright[]=new GreenfootImage [10];
    private GreenfootImage imageleft[]=new GreenfootImage [9];
    private GreenfootImage imagenesSaltoDer[]=new GreenfootImage[9];
    private GreenfootImage imagenesSaltoIzq[]=new GreenfootImage[9];
    private GreenfootImage imagenesSaltoDiagonalDer[]=new GreenfootImage[11];
    private GreenfootImage imagenesSaltoDiagonalIzq[]=new GreenfootImage[11];
    private GreenfootImage imagenesCachuchaDer[]=new GreenfootImage[8];
    private GreenfootImage imagenesCachuchaIzq[]=new GreenfootImage[8];
    private GreenfootImage imagenesCachuchaArrDer[]=new GreenfootImage[9];
    private GreenfootImage imagenesCachuchaArrIzq[]=new GreenfootImage[9];

    private boolean bandCaminarDer;
    private boolean bandCaminarIzq;
    private boolean bandSaltar;
    private boolean bandSaltarDiagonal;
    private boolean bandCaer;
    private boolean bandLanzaH;
    private boolean bandLanzaV;
    private int noImagen;
    private String direccion;

    private Contador bananas;
    private Contador vidas;
    private Contador llaves;
    private Contador cachuchas;
    private int puntos;

    /**
     * El constructor Jugador no contiene parametros pero aqui se inicializan las banderas,
     * el numero de imagen la direccion, etc.
     */
    public Jugador()
    {
        bandCaminarDer=false;
        bandCaminarIzq=false;
        bandSaltar=false;
        bandSaltarDiagonal=false;
        bandCaer=false;
        bandLanzaH=false;
        bandLanzaV=false;
        noImagen=0;
        direccion="derecha";
        this.CargarImagenes();
        puntos=0;
    }

    /**
     * Este metodo se encarga de incrementar los puntos dependiendo del nivel en el que se encuentre
     */
    public void incrementaPuntos()
    {   Escenario1 mundo=(Escenario1)super.getWorld();
        Cronometro crono=((Escenario1)this.getWorld()).getCrono();
        if(mundo.getNivel()==1)
            puntos=puntos+((bananas.getValor()*30))+500;
        if(mundo.getNivel()==2)
            puntos=puntos+((bananas.getValor()*40)+((crono.getMinutos()*60+crono.getSegundos())*bananas.getValor()))+1000;
        if(mundo.getNivel()==3)
            puntos=puntos+((bananas.getValor()*50)+((crono.getMinutos()*60+crono.getSegundos())*bananas.getValor()))+2000;

        System.out.println("Puntos: "+puntos+" Nivel: "+((Escenario1)this.getWorld()).getNivel());
    }

    /**
     * Este metodo actualiza los puntos que el jugador a ido acumulando durante el juego
     */
    public void actualizaPuntos()
    {
        if(UserInfo.isStorageAvailable())
        {

            UserInfo info=UserInfo.getMyInfo();
            if(puntos>info.getScore())
            {
                info.setScore(puntos);
            }
            info.store();
        }
    }


    /**
     * Este metodo añade al mundo el contador bananas, vidas, llaves y cachuchas
     */
    protected void addedToWorld(World mundo)
    {
        if(bananas==null && vidas==null && llaves==null && cachuchas==null)
        {
            bananas=new Contador(0,mundo,53,20);
            vidas=new Contador(3,mundo,674,20);
            llaves=new Contador(0,mundo,177,20);
            cachuchas=new Contador(5,mundo,562,20);
        }
        else
        {
            bananas.addToWorld(mundo,53,20);
            vidas.addToWorld(mundo,674,20);
            llaves.addToWorld(mundo,177,20);
            cachuchas.addToWorld(mundo,562,20);
        }
    }

    /**
     * En el metodo act se mandan llamar a diferentes metodos 
     */
    public void act()
    {
        this.mover();
        this.buscaItem();  
        this.revisaBanderas(); 
    } 

    /**
     * Este metodo se encarga de mandar llamar a otros metodos para mover al cango en el escenario
     */
    public void mover()
    {
        this.activaBanderaMov();
        this.caer();
        this.MueveDerecha(); 
        this.MueveIzquierda();
        this.saltaArriba();
        this.saltaDiagonal();
        this.lanzaV();
        this.lanzaH();
    }

    /**
     * Este metodo se encarga de activar las banderas para ver como se va a mover el chango
     * dependiendo de la tecla que se halla presionado
     * 
     */   
    public void activaBanderaMov()
    {
        Obstaculo obstaculo=(Obstaculo)super.getOneIntersectingObject(Obstaculo.class);
        GreenfootImage imagenChango=super.getImage();
        Escenario1 mundo=(Escenario1)this.getWorld();

        if(obstaculo==null && (super.getY()+(imagenChango.getHeight()/2))<490 && !bandSaltar && !bandSaltarDiagonal)
        {bandCaer=true;
            return;}
        if(Greenfoot.isKeyDown("c") && !mundo.getBandGorra() && cachuchas.getValor()>0)
        {bandLanzaV=true;
            return;}
        if(Greenfoot.isKeyDown("space") && !mundo.getBandGorra() && cachuchas.getValor()>0)
        {bandLanzaH=true;
            return;}
        if(Greenfoot.isKeyDown("right"))
        {bandCaminarDer=true;
            return;}
        if(Greenfoot.isKeyDown("left"))
        {bandCaminarIzq=true;
            return;}
        if(Greenfoot.isKeyDown("up"))
        {bandSaltar=true;
            return;}
        if(Greenfoot.isKeyDown("x"))
        {bandSaltarDiagonal=true;
            return;}
    }

    /**
     * Este metodo se encarga de cargar las imagenes del chango para su movimiento
     */
    public void CargarImagenes()
    {

        for(int i=0;i<8;i++)
            if(i==0)
            {
                imagenesCachuchaDer[i]=(new GreenfootImage("changoder.png"));
                imagenesCachuchaDer[i].scale(35,35);
                imagenesCachuchaIzq[i]=(new GreenfootImage("changoizq.png"));
                imagenesCachuchaIzq[i].scale(35,35);
            }
            else
            {
                imagenesCachuchaDer[i]=(new GreenfootImage("quitacachuchader"+(i+1)+".png"));
                imagenesCachuchaDer[i].scale(35,35);
                imagenesCachuchaIzq[i]=(new GreenfootImage("quitacachuchaizq"+(i+1)+".png"));
                imagenesCachuchaIzq[i].scale(35,35);
        }

        for(int i=0;i<10;i++)
            if(i==0)
            {
                imageright[i]=(new GreenfootImage("changoder.png"));
                imageright[i].scale(35,35);
            }
            else
            {
                imageright[i]=(new GreenfootImage("changoder"+(i+1)+".png"));
                imageright[i].scale(35,35);
        }

        for(int i=0;i<9;i++)
            if(i==0)
            {
                imageleft[i]=(new GreenfootImage("changoizq.png"));
                imageleft[i].scale(35,35);
                imagenesSaltoDer[i]=(new GreenfootImage("changoder.png"));
                imagenesSaltoDer[i].scale(35,35);
                imagenesSaltoIzq[i]=(new GreenfootImage("changoizq.png"));
                imagenesSaltoIzq[i].scale(35,35);
                imagenesCachuchaArrDer[i]=(new GreenfootImage("changoder.png"));
                imagenesCachuchaArrDer[i].scale(35,35);
                imagenesCachuchaArrIzq[i]=new GreenfootImage("changoizq.png");
                imagenesCachuchaArrIzq[i].scale(35,35);
            }
            else
            {
                imageleft[i]=(new GreenfootImage("changoizq"+(i+1)+".png"));
                imageleft[i].scale(35,35);
                imagenesSaltoDer[i]=(new GreenfootImage("brincader"+(i+1)+".png"));
                imagenesSaltoDer[i].scale(35,35);
                imagenesSaltoIzq[i]=(new GreenfootImage("brincarizq"+(i+1)+".png"));
                imagenesSaltoIzq[i].scale(35,35);
                imagenesCachuchaArrDer[i]=(new GreenfootImage("quitacachuchuchaArrDer"+(i+1)+".png"));
                imagenesCachuchaArrDer[i].scale(35,35);
                imagenesCachuchaArrIzq[i]=(new GreenfootImage("quitacachuchuchaArrIzq"+(i+1)+".png"));
                imagenesCachuchaArrIzq[i].scale(35,35);
        }

        for(int i=0;i<11;i++)
            if(i==0)
            {
                imagenesSaltoDiagonalIzq[i]=(new GreenfootImage("changoizq.png"));
                imagenesSaltoDiagonalIzq[i].scale(35,35);
                imagenesSaltoDiagonalDer[i]=(new GreenfootImage("changoizq.png"));
                imagenesSaltoDiagonalDer[i].scale(35,35);
            }
            else
            {
                imagenesSaltoDiagonalIzq[i]=(new GreenfootImage("brincadgizq"+(i+1)+".png"));
                imagenesSaltoDiagonalIzq[i].scale(35,35);
                imagenesSaltoDiagonalDer[i]=(new GreenfootImage("brincadgder"+(i+1)+".png"));
                imagenesSaltoDiagonalDer[i].scale(35,35);
        }
    }

    /**
     * Este metodo mueve el chango hacia la derecha sobre el escenario
     */
    public void MueveDerecha()
    {
        GreenfootImage imagen=this.getImage();
        if(bandCaminarDer && !bandCaer && !bandLanzaH && !bandLanzaV)
        {
            direccion="derecha";
            noImagen=(noImagen+1)%10;
            super.setImage(imageright[noImagen]);
            if((super.getX()+(imagen.getWidth()/2))<698)
                super.setLocation(super.getX()+2,super.getY());

            if(noImagen==0)
                bandCaminarDer=false;
        }  
    }

    /**
     * Este metodo mueve al chango a la izquierda sobre el escenario
     */
    public void MueveIzquierda()
    {
        GreenfootImage imagen=this.getImage();
        if(bandCaminarIzq && !bandCaer && !bandLanzaH && !bandLanzaV)
        {
            direccion="izquierda";
            noImagen=(noImagen+1)%9;
            super.setImage(imageleft[noImagen]);
            if((super.getX()-(imagen.getWidth()/2))>2)
                super.setLocation(super.getX()-2,super.getY());

            if(noImagen==0)
                bandCaminarIzq=false;
        }

    }

    /**
     * Este metodo hace que el chango salte hacia arriba en cualquier direccion en la que se encuentre
     */
    public void saltaArriba()
    {
        GreenfootImage imagen=this.getImage();

        if(bandSaltar && !bandCaer && !bandLanzaH && !bandLanzaV)
        {
            noImagen=(noImagen+1)%9;
            if(direccion=="derecha")
                super.setImage(imagenesSaltoDer[noImagen]);
            else
                super.setImage(imagenesSaltoIzq[noImagen]);

            if((super.getY()-(imagen.getHeight()/2))>60)
                super.setLocation(super.getX(),super.getY()-4);

            if(noImagen==0)
            {
                bandSaltar=false;
                bandCaer=true;
            }
        }
    }

    /**
     * Este metodo hace que el chango salte en diagonal en cualquier direccion en la que se encuentre
     */
    public void saltaDiagonal()
    {
        GreenfootImage imagen=this.getImage();
        if(bandSaltarDiagonal && !bandCaer && !bandLanzaH && !bandLanzaV)
        {
            noImagen=(noImagen+1)%11;
            if(direccion=="derecha")
            {super.setImage(imagenesSaltoDiagonalDer[noImagen]);
                if(((super.getY()-(imagen.getHeight()/2))>60) && ((super.getX()+(imagen.getWidth()/2))<698))
                    super.setLocation(super.getX()+4,super.getY()-7);}
            else
            {super.setImage(imagenesSaltoDiagonalIzq[noImagen]);
                if(((super.getY()-(imagen.getHeight()/2))>60) && ((super.getX()-(imagen.getWidth()/2))>2))
                    super.setLocation(super.getX()-4,super.getY()-7);}

            if(noImagen==0)
            {
                bandSaltarDiagonal=false;
                bandCaer=true;
            }
        }
    }

    /**
     * Este metodo hace que el chango caiga si no hay un obstaculo debajo de el (gravedad)
     */
    public void caer()
    {
        GreenfootImage imagen=this.getImage();
        Obstaculo obstaculo=(Obstaculo)super.getOneIntersectingObject(Obstaculo.class);
        if(obstaculo!=null)
        {
            obstaculo.posicionChango();
        }
        if(!bandCaer)
        {
            return;
        }
        if(bandCaer)
        {
            if(direccion=="derecha")
                super.setImage("callendoder.png");
            else
                super.setImage("callendoizq.png");

            if((super.getY()+(imagen.getHeight()/2))<490)
                super.setLocation(super.getX(),super.getY()+4);
            else
            {
                if(direccion=="derecha")
                    super.setImage("changoder.png");
                else
                    super.setImage("changoizq.png");
                this.cambiaBanderaCaer(false);
            }
        }
    }

    /**
     * Este metodo genera el lanzamiento de la gorra del jugador en forma vertical.
     */
    public void lanzaV()
    {
        if(bandLanzaV && !bandCaer)
        {
            noImagen=(noImagen+1)%24;
            if(direccion=="derecha")
                super.setImage(imagenesCachuchaArrDer[noImagen/4]);
            else
                super.setImage(imagenesCachuchaArrIzq[noImagen/4]);

            if(noImagen==0)
            {
                Escenario1 mundo=(Escenario1)this.getWorld();
                Gorra nuevaGorra=new Gorra("arriba");
                mundo.addObject(nuevaGorra,this.getX(),this.getY()-20);
                mundo.cambiaBandGorra(true);
                cachuchas.decrementarValor(1);
                bandLanzaV=false;
            }
        }
    }

    /**
     * Este metodo genera el lanzamiento de la gorra del jugador en forma horizontal.
     */
    public void lanzaH()
    {
        if(bandLanzaH && !bandCaer)
        {
            noImagen=(noImagen+1)%24;
            if(direccion=="derecha")
                super.setImage(imagenesCachuchaDer[noImagen/4]);
            else
                super.setImage(imagenesCachuchaIzq[noImagen/4]);

            if(noImagen==0)
            {
                Escenario1 mundo=(Escenario1)this.getWorld(); 
                Gorra newGorra= new Gorra(direccion);
                if(direccion=="derecha")
                    mundo.addObject(newGorra,this.getX()+20,this.getY());
                if(direccion=="izquierda")
                    mundo.addObject(newGorra,this.getX()-20,this.getY());
                mundo.cambiaBandGorra(true);
                cachuchas.decrementarValor(1);
                bandLanzaH=false;
            }
        }
    }

    
    /**
     * Este metodo verifica que no se activen 2 banderas de movimiento a la vez
     */  
    public void revisaBanderas()
    {
        if(bandCaminarDer && (bandCaminarIzq || bandSaltar || bandSaltarDiagonal || bandCaer))
        {
            bandCaminarDer=false;
            bandCaminarIzq=false;
            bandSaltar=false;
            bandSaltarDiagonal=false;
        }

        if(bandCaminarIzq && (bandCaminarDer || bandSaltar || bandSaltarDiagonal || bandCaer))
        {
            bandCaminarDer=false;
            bandCaminarIzq=false;
            bandSaltar=false;
            bandSaltarDiagonal=false;
        }

        if(bandSaltar && (bandCaminarIzq || bandCaminarDer || bandSaltarDiagonal || bandCaer))
        {
            bandCaminarDer=false;
            bandCaminarIzq=false;
            bandSaltar=false;
            bandSaltarDiagonal=false;
        }

        if(bandSaltarDiagonal && (bandCaminarIzq || bandSaltar || bandCaminarDer || bandCaer || bandLanzaH || bandLanzaV))
        {
            bandCaminarDer=false;
            bandCaminarIzq=false;
            bandSaltar=false;
            bandSaltarDiagonal=false;
            bandLanzaH=false;
            bandLanzaV=false;
        }
    }

    /**
     * Este metodo verifica si el chango encontró un Item
     */
    public void buscaItem()
    {
        Item unItem;
        unItem=(Item)this.getOneObjectAtOffset(0,0,Item.class);
        if(unItem!=null)
            unItem.modificaChango(this);
    }

    /**
     * Este metodo regresa el contador de bananas.
     */
    public Contador getBananas()
    {
        return bananas;
    }

    /**
     * Este metodo regresa el contador de Vidas.
     */
    public Contador getVidas()
    {
        return vidas;
    }

    /**
     * Este metodo regresa el contador de llaves.
     */
    public Contador getLlaves()
    {
        return llaves;
    }

    /**
     * Regresa el contador de cachuchas del jugador.
     */
    public Contador getNumCachuchas()
    {
        return cachuchas;
    }

    /**
     * Este metodo cambia la bandera Caer del jugador.
     * @param value es el nuevo valor que tomará la bandera.
     */
    public void cambiaBanderaCaer(boolean value)
    {
        if(bandCaer==true)
            if(direccion=="derecha")
                super.setImage("changoder.png");
            else
                super.setImage("changoizq.png");
        bandCaer=value;
    }

    /**
     * Este metodo regresa la bandera caer.
     */
    public boolean getCaer()
    {
        return bandCaer;
    }

}

